package main

import (
	"bytes"
	"fmt"
	"strconv"
	"strings"
)

func main() {
	/*strings包下的关于字符串的函数*/
	s1 := "helloworld"
	//1.是否包含指定的内容-->bool
	fmt.Println(strings.Contains(s1, "abc"))
	//2.是否包含chars中任意的一个字符即可
	fmt.Println(strings.ContainsAny(s1, "abcd"))
	//3.统计substr在s中出现的次数
	fmt.Println(strings.Count(s1, "lloo"))

	//4.以xxx前缀开头，以xxx后缀结尾
	s2 := "20230506整理笔记.txt"
	if strings.HasPrefix(s2, "201905") {
		fmt.Println("23年5月的文件。。")
	}
	if strings.HasSuffix(s2, ".txt") {
		fmt.Println("文本文档。。")
	}

	//索引
	//helloworld
	fmt.Println(strings.Index(s1, "lloo"))     //查找substr在s中的位置，如果不存在就返回-1
	fmt.Println(strings.IndexAny(s1, "abcdh")) //查找chars中任意的一个字符，出现在s中的位置
	fmt.Println(strings.LastIndex(s1, "l"))    //查找substr在s中最后一次出现的位置

	//字符串的拼接
	ss1 := []string{"abc", "world", "hello", "ruby"}
	s3 := strings.Join(ss1, "-")
	fmt.Println(s3)

	//切割
	s4 := "123,4563,aaa,49595,45"
	ss2 := strings.Split(s4, ",")
	//fmt.Println(ss2)
	for i := 0; i < len(ss2); i++ {
		fmt.Println(ss2[i])
	}

	//重复，自己拼接自己count次
	s5 := strings.Repeat("hello", 5)
	fmt.Println(s5)

	//替换
	//helloworld
	s6 := strings.Replace(s1, "l", "*", -1)
	fmt.Println(s6)
	//fmt.Println(strings.Repeat("hello",5))

	s7 := "heLLo WOrlD**123.."
	fmt.Println(strings.ToLower(s7))
	fmt.Println(strings.ToUpper(s7))

	/*
		截取子串：
		substring(start,end)-->substr
		str[start:end]-->substr
			包含start，不包含end下标
	*/
	fmt.Println(s1)
	s8 := s1[:5]
	fmt.Println(s8)
	fmt.Println(s1[5:])

	/*
		strconv包：字符串和基本类型之前的转换
			string convert
	*/
	//fmt.Println("aa"+100)
	//1.bool类型
	sa1 := "true"
	b1, err := strconv.ParseBool(sa1)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%T,%t\n", b1, b1)

	ssa1 := strconv.FormatBool(b1)
	fmt.Printf("%T,%s\n", ssa1, ssa1)

	//2.整数
	sa2 := "100"
	i2, err := strconv.ParseInt(sa2, 2, 64)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%T,%d\n", i2, i2)

	ssa2 := strconv.FormatInt(i2, 10)
	fmt.Printf("%T,%s\n", ssa2, ssa2)

	//itoa(),atoi()
	i3, err := strconv.Atoi("-42") //转为int类型
	fmt.Printf("%T,%d\n", i3, i3)
	ss3 := strconv.Itoa(-42)
	fmt.Printf("%T,%s\n", ss3, ss3)

	/*基础语法 —— strings 包*/
	//string 的拼接直接使用 + 号就可以。注意的是，某些语言支持string 和别的类型拼接，但是 golang 不可以
	println("hello" + "string")

	//strings 主要方法（你所需要的全部都可以找到）：strings.xxx
	//• 查找和替换
	println(strings.Replace("username", "name", "password", 1)) //userpassword
	//• 大小写转换
	println(strings.ToUpper("username")) //USERNAME
	//• 子字符串相关
	println(strings.Index("username", "name")) //4
	//• 相等
	println(strings.EqualFold("user", "usr")) //false

	/*
		基础语法 —— rune 类型
		• rune，直观理解，就是字符
		• rune 不是 byte!
		• rune 本质是 int32，一个rune四个字节
		• rune 在很多语言里面是没有的，与之对应的是，golang 没有 char 类型。rune 不是数字，也不是 char，也不是 byte！
		• 实际中不太常用
	*/
	var a rune = 123
	var b int32 = 123
	println(a, b, a == b) //123 123 true

	/*
		基础语法 ——bool, int, uint, float 家族
		• bool: true, false
		• int8, int16, int32, int64, int
		• uint8, uint16, uint32, uint64, uint
		• float32, float64
	*/
	var a1 int32 = 100
	var b11 int64 = 120
	c1 := b11 - int64(a1)
	println(c1) //20

	/*
		基础语法 —— byte 类型
		• byte，字节，本质是 uint8
		• 对应的操作包在 bytes.xxx 上
	*/
	println(bytes.Equal([]byte{1, 2}, []byte{3, 2})) //false

	/*
		基础语法 —— 类型总结
		• golang 的数字类型明确标注了长度、有无符号
		• golang 不会帮你做类型转换，类型不同无法通过编译。也因此，string 只能和string 拼接
		• golang 有一个很特殊的 rune 类型，接近一般语言的 char 或者 character 的概念，非面试情况下，可以理解为 “rune = 字符”
		• string 遇事不决找 strings 包
	*/
}
